using System;
using System.Collections.Generic;
using UD.Seguridad.Entity;
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data.Common;
using System.Data;
using UD.Utilities.Exceptions;

namespace UD.Seguridad.DataAccess
{
    public class ModuloDAL : GeneralDAL
    {
        public ModuloDAL()
        {
        }
        public int InsertarModulo(Modulo pModulo)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_SEG_Modulo_Insertar"))
                {
                    int vResultado;
                    vDataBase.AddOutParameter(vDbCommand, "@IdModulo", DbType.Int32, 18);
                    vDataBase.AddInParameter(vDbCommand, "@NombreModulo", DbType.String, pModulo.NombreModulo);
                    vDataBase.AddInParameter(vDbCommand, "@PosicionModulo", DbType.Int32, pModulo.PosicionModulo);
                    vDataBase.AddInParameter(vDbCommand, "@EstadoModulo", DbType.Boolean, pModulo.EstadoModulo);
                    vDataBase.AddInParameter(vDbCommand, "@UsuarioCrea", DbType.String, pModulo.UsuarioCrea);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    pModulo.IdModulo = Convert.ToInt32(vDataBase.GetParameterValue(vDbCommand, "@IdModulo").ToString());
                    GenerarLogAuditoria(pModulo, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }
        public int ModificarModulo(Modulo pModulo)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_SEG_Modulo_Modificar"))
                {
                    int vResultado;
                    vDataBase.AddInParameter(vDbCommand, "@IdModulo", DbType.Int32, pModulo.IdModulo);
                    vDataBase.AddInParameter(vDbCommand, "@NombreModulo", DbType.String, pModulo.NombreModulo);
                    vDataBase.AddInParameter(vDbCommand, "@PosicionModulo", DbType.Int32, pModulo.PosicionModulo);
                    vDataBase.AddInParameter(vDbCommand, "@EstadoModulo", DbType.Boolean, pModulo.EstadoModulo);
                    vDataBase.AddInParameter(vDbCommand, "@UsuarioModifica", DbType.String, pModulo.UsuarioModifica);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    GenerarLogAuditoria(pModulo, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }
        public int EliminarModulo(Modulo pModulo)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_SEG_Modulo_Eliminar"))
                {
                    int vResultado;
                    vDataBase.AddInParameter(vDbCommand, "@IdModulo", DbType.Int32, pModulo.IdModulo);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    GenerarLogAuditoria(pModulo, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }


        public Modulo ConsultarModulo(int pIdModulo)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_SEG_Modulo_Consultar"))
                {
                    vDataBase.AddInParameter(vDbCommand, "@IdModulo", DbType.Int32, pIdModulo);
                    using (IDataReader vDataReaderResults = vDataBase.ExecuteReader(vDbCommand))
                    {
                        Modulo vModulo = new Modulo();
                        while (vDataReaderResults.Read())
                        {
                            vModulo.IdModulo = vDataReaderResults["IdModulo"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdModulo"].ToString()) : vModulo.IdModulo;
                            vModulo.NombreModulo = vDataReaderResults["NombreModulo"] != DBNull.Value ? Convert.ToString(vDataReaderResults["NombreModulo"].ToString()) : vModulo.NombreModulo;
                            vModulo.PosicionModulo = vDataReaderResults["PosicionModulo"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["PosicionModulo"].ToString()) : vModulo.PosicionModulo;
                            vModulo.EstadoModulo = vDataReaderResults["EstadoModulo"] != DBNull.Value ? Convert.ToBoolean(vDataReaderResults["EstadoModulo"].ToString()) : vModulo.EstadoModulo;
                            vModulo.UsuarioCrea = vDataReaderResults["UsuarioCrea"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioCrea"].ToString()) : vModulo.UsuarioCrea;
                            vModulo.FechaCrea = vDataReaderResults["FechaCrea"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaCrea"].ToString()) : vModulo.FechaCrea;
                            vModulo.UsuarioModifica = vDataReaderResults["UsuarioModifica"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioModifica"].ToString()) : vModulo.UsuarioModifica;
                            vModulo.FechaModifica = vDataReaderResults["FechaModifica"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaModifica"].ToString()) : vModulo.FechaModifica;
                        }
                        return vModulo;
                    }
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new GenericException(ex);
            }
        }

        public List<Modulo> ConsultarModulos(String pNombreModulo, int? pPosicionModulo, Boolean? pEstadoModulo)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_SEG_Modulos_Consultar"))
                {
                    if(pNombreModulo != null)
                         vDataBase.AddInParameter(vDbCommand, "@NombreModulo", DbType.String, pNombreModulo);
                    if(pPosicionModulo != null)
                         vDataBase.AddInParameter(vDbCommand, "@PosicionModulo", DbType.Int32, pPosicionModulo);
                    if(pEstadoModulo != null)
                         vDataBase.AddInParameter(vDbCommand, "@EstadoModulo", DbType.Boolean, pEstadoModulo);
                    using (IDataReader vDataReaderResults = vDataBase.ExecuteReader(vDbCommand))
                    {
                        List<Modulo> vListaModulo = new List<Modulo>();
                        while (vDataReaderResults.Read())
                        {
                                Modulo vModulo = new Modulo();
                            vModulo.IdModulo = vDataReaderResults["IdModulo"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdModulo"].ToString()) : vModulo.IdModulo;
                            vModulo.NombreModulo = vDataReaderResults["NombreModulo"] != DBNull.Value ? Convert.ToString(vDataReaderResults["NombreModulo"].ToString()) : vModulo.NombreModulo;
                            vModulo.PosicionModulo = vDataReaderResults["PosicionModulo"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["PosicionModulo"].ToString()) : vModulo.PosicionModulo;
                            vModulo.EstadoModulo = vDataReaderResults["EstadoModulo"] != DBNull.Value ? Convert.ToBoolean(vDataReaderResults["EstadoModulo"].ToString()) : vModulo.EstadoModulo;
                            vModulo.UsuarioCrea = vDataReaderResults["UsuarioCrea"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioCrea"].ToString()) : vModulo.UsuarioCrea;
                            vModulo.FechaCrea = vDataReaderResults["FechaCrea"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaCrea"].ToString()) : vModulo.FechaCrea;
                            vModulo.UsuarioModifica = vDataReaderResults["UsuarioModifica"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioModifica"].ToString()) : vModulo.UsuarioModifica;
                            vModulo.FechaModifica = vDataReaderResults["FechaModifica"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaModifica"].ToString()) : vModulo.FechaModifica;
                                vListaModulo.Add(vModulo);
                        }
                        return vListaModulo;
                    }
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new GenericException(ex);
            }
        }
    }
}
